package Thread;
/**线程安全问题！！！*/
public class demo15 {
    private static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                count++;
            }
            System.out.println("t1结束");
        });

        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                count++;
            }
            System.out.println("t2结束");
        });

//        t1.start();
//        t2.start();
//        // 预期结果是10w,但是这里是0（说明main线程先执行打印了，希望先执行t1,t2,加上t1.join,t2.join）
//
//        t1.join();
//        t2.join();      // 还不是10w，这是由于多线程引起的，将其改为串行执行就没有这个问题了

        t1.start();
        t1.join();
        t2.start();
        t2.join();      // 串行执行

        System.out.println(count);
    }
}

/*count++ 操作并不是线程安全的。这意味着当两个或多个线程同时尝试增加 count 的值时，
 * 可能会出现竞争条件（race condition），导致最终的结果小于预期的100,000。
 * 具体来说，count++ 实际上包含了三个步骤：
 * 1.读取 count 的当前值。
 * 2.将该值加1。
 * 3。将新的值写回给 count。
 * 如果两个线程几乎同时执行这些操作，就可能发生以下情况：
 * 1.线程1读取 count 的值（假设为0）。
 * 2.在线程1完成其操作之前，线程2也开始读取 count 的值（依然是0）。
 * 3.线程1将 count 增加到1，并将其写回。
 * 4.线程2也将 count 增加到1，并将其写回。
 * 结果是 count 只增加了1次而不是2次，尽管两个线程都执行了 count++。这种情况下，最终的 count 值会低于100,000。*/
